package cliente;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import construtora.Construtora;


public class ClienteDAOHibernate implements ClienteDAO{

	private Session	session;

	public void setSession(Session session) {
		this.session = session;
	}

	public void salvar(Cliente cliente) {
		this.session.save(cliente);
	}

	public void atualizar(Cliente cliente) {

		if (cliente.getPermissao() == null || cliente.getPermissao().size() == 0) {
			Cliente clientePermissao = this.carregar(cliente.getCodigo());
			cliente.setPermissao(clientePermissao.getPermissao());
			this.session.evict(clientePermissao);
		}

		this.session.update(cliente);
	}

	public void excluir(Cliente cliente) {
		this.session.delete(cliente);
	}

	public Cliente carregar(Integer codigo) {
		//TODO o hibernate nao conseguira fazer a carga caso seja passado o Cliente
		// no parametro, tem que ser diretamente a chave (integer)
		return (Cliente) this.session.get(Cliente.class, codigo);
	}

	public Cliente buscarPorLogin(String login) {
		String hql = "select c from Cliente c where c.login = :login";
		Query consulta = this.session.createQuery(hql);
		consulta.setString("login", login);

		//TODO mostrar primeiramente com o list e depois apresentar o uniqueResult
		return (Cliente) consulta.uniqueResult();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Cliente> listar() {
		String hql = "select c from Cliente c";
		Query consulta = this.session.createQuery(hql); 
		List<Cliente> clientes = consulta.list();
		return clientes;
	}
	/*@SuppressWarnings("unchecked")
	public List<Cliente> listar() {
		return this.session.createCriteria(Cliente.class).list();
	}*/

}
